import axios from 'axios';

//声明 reducer 函数
let TodosReducer = (todos=[], action) => {
  //判断 action.type
  switch(action.type){
    case 'todo_init':
      return action.payload;
    case 'todo_add':
      return [...todos, action.payload];
    case 'todo_check':
      //返回一个新的数组
      return todos.map(item => {
        //如果当前任务的 id 等于更新成功的任务 id
        if(item.id === action.payload.id){
          //则直接返回更新后的任务的对象
          return action.payload;
        }
        //如果当前循环的任务id与更新的任务id不相等, 则直接返回对象
        return item;
      })
    case 'todo_remove':
      // return todos.filter(item => {
      //   //如果相等
      //   if(item.id === action.payload){
      //     return false;
      //   }else{
      //     return true;
      //   }
      // })
      return todos.filter(item => item.id !== action.payload);
    default: 
      return todos;
  }
}

//暴露
export default TodosReducer;

// let addAction = () => ({})   // {type: 'add', payload: 10}

//封装异步的 action creator   // 返回值是一个函数  
export function asyncGetTodos(){
  return async dispatch => {
    //发送 AJAX 请求
    let result = await axios.get('http://localhost:9000/todo');
    //更新当前的状态值
    dispatch({type: 'todo_init', payload: result.data});
  }
}

//封装异步的 action creator 新增任务
export let asyncAddTodo = title => {
  return async dispatch => {
    //新增
    let result = await axios.post('http://localhost:9000/todo', {
      title: title,
      done: false
    });
    //查看结果  result
    // console.log(result.data);
    //更新 redux 中的 todos 状态
    dispatch({type: 'todo_add', payload: result.data})
  }
}

//更新任务的完成状态
export let asyncCheckTodo = (id, done) => {
  return async dispatch => {
    let result = await axios.patch(`http://localhost:9000/todo/${id}`, {done: done});
    //输出结果
    // console.log(result);
    //更新 redux 的状态
    dispatch({type: 'todo_check', payload: result.data});
  }
}

//删除任务
export let asyncRemoveTodo = (id) => {
  return async dispatch => {
    //发送请求 删除任务
    await axios.delete(`http://localhost:9000/todo/${id}`);
    //更新任务列表状态                       2
    dispatch({type: 'todo_remove',payload: id })
  }
}